package com.payment.paymentmanagersystem.dal;

import com.payment.paymentmanagersystem.idal.IUserDAL;
import com.payment.paymentmanagersystem.model.PayInfo;
import com.payment.paymentmanagersystem.model.UserInfo;
import com.payment.paymentmanagersystem.unit.EncryptHelper;
import com.payment.paymentmanagersystem.unit.Pager;
import com.payment.paymentmanagersystem.unit.PagerData;
import com.payment.paymentmanagersystem.unit.RandomCodeUtils;
import org.apache.ibatis.annotations.Select;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 用户相关功能方法实现
 * @author 李耀华
 * @date 2023年6月14日
 */

@Service
public class UserDAL {
    @Autowired
    IUserDAL iUserDAL;

    /**
     * 用户账号注册
     * @param: 登录用户名，密码，注册邮箱（用于激活）
     */
    public boolean RegisterUser(UserInfo user){
        //生成系统随机码，用于激活，与用户注册信息一起添加进数据库
        user.setAlive_code(RandomCodeUtils.makeRandomCode(20));
        //加密用户密码
        user.setUser_loginpass(EncryptHelper.SHA(user.getUser_loginpass()));

        if(iUserDAL.RegisterUser(user)>0){
            return true;
        }else{
            return false;
        }
    }

    /**
     * 注册用户前验证用户名是否已经存在
     *
     */
    public boolean isLoginNameExits(UserInfo user){
        if(iUserDAL.isLoginNameExits(user)>0){
            return true;
        }else {
            return false;
        }
    }

    /**
     * 注册用户前验证邮箱是否已经存在
     *
     */
    public boolean isEmailExits(UserInfo user){
        if(iUserDAL.isEmailExits(user)>0){
            return true;
        }else{
            return false;
        }
    }

    /**
     * 用户账号注册时邮件激活方法
     * 向用户发送激活链接，关键字是激活链接上的随机字符串进行验证
     * 激活后 @param isAlive = 1
     */
    public boolean activeEmail(UserInfo user){
        if(iUserDAL.activeEmail(user)>0){
            return true;
        }else{
            return false;
        }
    }

    /**
     * 用户账户登录
     * 支持多种方式
     * 可以使用邮箱或者登录用户名登录
     */
    public UserInfo validateUser(UserInfo user){
        //加密用户密码后进行比对
        user.setUser_loginpass(EncryptHelper.SHA(user.getUser_loginpass()));
        System.out.println(user.getUser_loginpass());
        return iUserDAL.validateUser(user);
    }

    /**
     * 用户账号信息修改
     */
    public boolean EditUser(UserInfo user){
        if(iUserDAL.EditUser(user)>0){
            return true;
        }else{
            return false;
        }
    }

    /**
     * 用户账户冻结
     * 修改 @param isBlock = 1 冻结
     */
    public boolean blockUser(UserInfo user){
        if(iUserDAL.blockUser(user)>0){
            return true;
        }else{
            return false;
        }
    }

    /**
     * 修改账号密码前
     * 先进行密码校验
     * 再修改密码
     */
    public boolean EditUserPass(UserInfo user){
        //修改密码前验证
        if(validateUser(user)!=null){
            user.setUser_loginnewpass(EncryptHelper.SHA(user.getUser_loginnewpass()));
            if(iUserDAL.EditUserPass(user)>0){
                return true;
            }else{
                return false;
            }
        }
        return false;
    }

    /**
     * 用户查询自己个人信息
     */
    public UserInfo getUserInfoByUserID(UserInfo user){
        return iUserDAL.getUserInfoByUserID(user);
    }

    /**
     * 管理用户
     * 用户分页信息
     * 参数1：startIndex
     * 参数2:pageSize
     */
    private List<UserInfo> getUsersByPager(Pager pager){
        Integer currentPage = pager.getCurrentPage();
        Integer startindex = (currentPage-1)*pager.getPageSize();
        pager.setStartIndex(startindex);
        return iUserDAL.getAllUsersByPager(pager);
    }

    /**
     * 计算用户列表分页页码
     * 返回 pageTotal
     */
    private Integer getPageTotal(Pager pager){
        Integer usersTotalNum = getAllUsersCounts();
        Integer pageTotal = 1;
        //数据总条数除以pageSize，如果有余数也不能整除，页数+1
        //可以整除，页数=数据总条/pageSize
        pageTotal = usersTotalNum/pager.getPageSize();
        if(usersTotalNum%pager.getPageSize()>0){
            pageTotal = pageTotal+1;
        }
        return  pageTotal;
    }

    /**
     * 封装用户分页数据提供前端调用
     */
    public PagerData getAllUsersPager(Pager pager){
        //调用封装的好方法进行数据装载
        PagerData pagerData = new PagerData();
        pagerData.setData(getUsersByPager(pager));
        pagerData.setPageTotal(getPageTotal(pager));
        return pagerData;
    }

    /**
     * 管理用户
     * 用户分页页面计算所需数据行数
     */
    private Integer getAllUsersCounts(){
        return iUserDAL.getAllUsersCounts();
    }

    /**
     * 验证收款用户的合法性
     * 检测是否存在、是否激活、是否禁用
     */
    public UserInfo validatePayeeUser(UserInfo user){
        return iUserDAL.validatePayeeUser(user);
    }

    /**
     * 查询个人账户余额
     *
     */
    public UserInfo getBlanceByUserId(UserInfo user){
        return iUserDAL.getBlanceByUserId(user);
    }

    /**
     * 查询用户支付信息
     * 这里查询的支付信息是混合的，我们需要进行内容改造
     * 一种这里改造，另一种在前端改造
     */
    public List<PayInfo> getPayInfoListByUserId(UserInfo user){
        return iUserDAL.getPayInfoListByUserId(user);
    }
}
